#include<iostream>
#include<pthread.h>
#include<unistd.h>
#include<string>

using namespace std;

//条件变量

//静态初始化
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
//静态锁
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;

//启动函数
void*Action(void*args)
{
    string name=static_cast<const char*>(args);

    while(true)
    {
        //申请锁
        pthread_mutex_lock(&mutex);

        //等待唤醒
        pthread_cond_wait(&cond,&mutex);
        cout<<name<<" 运行"<<endl;

        //解锁
        pthread_mutex_unlock(&mutex);
    }

    return nullptr;
}

int main()
{
    pthread_t tids[5];

    //创建5个线程
    for(int i=0;i<5;++i)
    {   
        //线程名
        char *name=new char[32];
        snprintf(name,32,"thread-%d",i+1);

        pthread_create(tids+i,nullptr,Action,name);
    }

    sleep(3);
    
    //唤醒
    while(true)
    {
        cout<<"主线程唤醒线程..."<<endl;
        //pthread_cond_signal(&cond);
        pthread_cond_broadcast(&cond);
        sleep(1);
    }

    for (int i = 0; i < 5; i++)
    {
        pthread_join(tids[i], nullptr);
    }


    return 0;
}



















///////////////////////////////////////////////////////////////////////////////////////////////////////////

//死锁

// pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;

// void* Rountine(void*)
// {
//     //加锁
//     pthread_mutex_lock(&mutex);

//     cout<<"I got the mutex"<<endl;

//     pthread_mutex_lock(&mutex);//再次加锁，会阻塞在这里，出现死锁
//     sleep(1);
//     cout<<"I am alive"<<endl;//运行到这，说明死锁解除了

//     pthread_mutex_unlock(&mutex);//解锁

//     return nullptr;
// }

// int main()
// {
//     pthread_t tid;

//     pthread_create(&tid,nullptr,Rountine,nullptr);

//     sleep(2);
//     cout<<"Main thread running..."<<endl;
//     sleep(1);

//     pthread_mutex_unlock(&mutex);//解除线程的死锁

//     cout<<"unlock the thread"<<endl;
//     sleep(2);

//     return 0;
// }